from firewall_interface import *

# ====================生成命令======================
#-----要求-----
#- 根据已有sample-data，创建Rule对象，判断数据有效性，生成iptables命令
#- 封装函数 
#       def addRule(rule:Rule)  -- 根据-I ；判断数据是否有效，拼接字符串
#       def deleteRule(chain:Direction, num:int)

#-验证 使用subprocess验证是否能够添加和删除rule

    # 判断数据是否有效 src port， -1   0.0.0.0/0
    # num是否在正确范围内；
    # 是否需要添入命令

#Rule对象的使用  
#字符串的操作
#正则表达式
#format格式化输出

#----常用命令----
    #在链中第num条规则之前插入规则，默认是1
        #iptables -I [INPUT/OUTPUT][num] -j[target] -s [src] --sport [] -d [dst] --dport []

    #删除链中第num条命令
        #iptables -D [INPUT/OUTPUT] [num]

    #列出某条链中的规则
        #iptables -nvL [INPUT/OUTPUT] --line-numbers


#前端会发过来的数据
sample_data_1 = {
  'direction':0,          #INPUT/OUTPUT 
  'target': 1 ,           #Target -j
  'num':1,                #-A -I  0最高，直接-I
  'protocol': 6,          #-p
  'sport': -1,            #--sport
  'dport': 8000,          #--dport 
  'src': "0.0.0.0 /0",    #-s
  'dst': "0.0.0.0 /0",    #-d
}

sample_data_2 = {
  'direction':1 ,
  'target': 0 ,
  'num':1,
  'protocol': 1 ,
  'sport': -1,
  'dport': -1,
  'src': "192.168.100.110 /24",
  'dst': "0.0.0.0 /0",
}

#e.g
target = '-j ACCEPT'
proto = '-p tcp'
src = ''
dst = ''
cmd = 'iptables -I {} {} {} {} {}'.format(target,proto,src,dst)

print(cmd);print()

#要删除的rule
sample_data_3 = {
  'num' : 1,
  'chain' : Direction.INPUT
}

print(sample_data_1) ;print()
print(sample_data_1['target']) ;print()


def addRule(rule:Rule):
  print( rule.direction,rule.num ) ;print()
  print( rule.direction == Direction.INPUT );print()
  #运行命令具体看shell.py


#调用
newRule = Rule(sample_data_1)#构造一个rule对象
addRule(newRule)








#=======================解析命令结果=======================

#-----要求-----
# 已知结果iptables结果
sample_result = \
['Chain OUTPUT (policy ACCEPT 1292 packets, 2683K bytes)', 
'num   pkts bytes target     prot opt in     out     source               destination         ', 
'1        0     0 ACCEPT     udp  --  *      *       172.26.240.0/20      0.0.0.0/0            udp spt:8080 dpt:8081', 
'2        0     0 ACCEPT     tcp  --  *      *       172.26.240.0/20      0.0.0.0/0            tcp spt:8080 dpt:8081', 
'3        0     0 REJECT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable', 
'4       20  1960 ACCEPT     icmp --  *      *       0.0.0.0/0            172.26.240.0/20     ', 
'5       12  1176 REJECT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable'
]

# 提取出每一行的信息，写入字典(像上面sample-data一样)，再存入list中



#----e.g----
def processChain(iptableResults:list[str], ruleList: list):
  #也可以直接从line1开始
  # for line in iptableResults:
  #   line = line.split() #以空格分隔字符串，存入list中

  #   print(line);print()
  #   rule = {}  #创建字典
  #   if(line[4] == 'tcp'):
  #     rule['protocol'] = Protocol.TCP  #添加元素
  #     print(rule)

  #   ruleList.append(rule)

  for i in range(len(iptableResults)):
    line = iptableResults[i].split()
    print(line); print()
    #for j in range(len(line)):
      #print(line[j],end='\n')

#调用
ruleList = []
processChain(sample_result,ruleList)


#list的操作
#dict的操作
#字符串的操作 - split('') ...